/*
 A class to parse color values
 @author Stoyan Stefanov <sstoo@gmail.com>
 @link   http://www.phpied.com/rgb-color-parser-in-javascript/
 Use it if you like it

 canvg.js - Javascript SVG parser and renderer on Canvas
 MIT Licensed 
 Gabe Lerner (gabelerner@gmail.com)
 http://code.google.com/p/canvg/

 Requires: rgbcolor.js - http://www.phpied.com/rgb-color-parser-in-javascript/

 Highcharts JS v4.0.4 (2014-09-02)
 CanVGRenderer Extension module

 (c) 2011-2012 Torstein Honsi, Erik Olsson

 License: www.highcharts.com/license
 */
function RGBColor(m) {
    this.ok = !1;
    m.charAt(0) == "#" && (m = m.substr(1, 6));
    var m = m.replace(/ /g, ""), m = m.toLowerCase(), a = {
        aliceblue: "f0f8ff",
        antiquewhite: "faebd7",
        aqua: "00ffff",
        aquamarine: "7fffd4",
        azure: "f0ffff",
        beige: "f5f5dc",
        bisque: "ffe4c4",
        black: "000000",
        blanchedalmond: "ffebcd",
        blue: "0000ff",
        blueviolet: "8a2be2",
        brown: "a52a2a",
        burlywood: "deb887",
        cadetblue: "5f9ea0",
        chartreuse: "7fff00",
        chocolate: "d2691e",
        coral: "ff7f50",
        cornflowerblue: "6495ed",
        cornsilk: "fff8dc",
        crimson: "dc143c",
        cyan: "00ffff",
        darkblue: "00008b",
        darkcyan: "008b8b",
        darkgoldenrod: "b8860b",
        darkgray: "a9a9a9",
        darkgreen: "006400",
        darkkhaki: "bdb76b",
        darkmagenta: "8b008b",
        darkolivegreen: "556b2f",
        darkorange: "ff8c00",
        darkorchid: "9932cc",
        darkred: "8b0000",
        darksalmon: "e9967a",
        darkseagreen: "8fbc8f",
        darkslateblue: "483d8b",
        darkslategray: "2f4f4f",
        darkturquoise: "00ced1",
        darkviolet: "9400d3",
        deeppink: "ff1493",
        deepskyblue: "00bfff",
        dimgray: "696969",
        dodgerblue: "1e90ff",
        feldspar: "d19275",
        firebrick: "b22222",
        floralwhite: "fffaf0",
        forestgreen: "228b22",
        fuchsia: "ff00ff",
        gainsboro: "dcdcdc",
        ghostwhite: "f8f8ff",
        gold: "ffd700",
        goldenrod: "daa520",
        gray: "808080",
        green: "008000",
        greenyellow: "adff2f",
        honeydew: "f0fff0",
        hotpink: "ff69b4",
        indianred: "cd5c5c",
        indigo: "4b0082",
        ivory: "fffff0",
        khaki: "f0e68c",
        lavender: "e6e6fa",
        lavenderblush: "fff0f5",
        lawngreen: "7cfc00",
        lemonchiffon: "fffacd",
        lightblue: "add8e6",
        lightcoral: "f08080",
        lightcyan: "e0ffff",
        lightgoldenrodyellow: "fafad2",
        lightgrey: "d3d3d3",
        lightgreen: "90ee90",
        lightpink: "ffb6c1",
        lightsalmon: "ffa07a",
        lightseagreen: "20b2aa",
        lightskyblue: "87cefa",
        lightslateblue: "8470ff",
        lightslategray: "778899",
        lightsteelblue: "b0c4de",
        lightyellow: "ffffe0",
        lime: "00ff00",
        limegreen: "32cd32",
        linen: "faf0e6",
        magenta: "ff00ff",
        maroon: "800000",
        mediumaquamarine: "66cdaa",
        mediumblue: "0000cd",
        mediumorchid: "ba55d3",
        mediumpurple: "9370d8",
        mediumseagreen: "3cb371",
        mediumslateblue: "7b68ee",
        mediumspringgreen: "00fa9a",
        mediumturquoise: "48d1cc",
        mediumvioletred: "c71585",
        midnightblue: "191970",
        mintcream: "f5fffa",
        mistyrose: "ffe4e1",
        moccasin: "ffe4b5",
        navajowhite: "ffdead",
        navy: "000080",
        oldlace: "fdf5e6",
        olive: "808000",
        olivedrab: "6b8e23",
        orange: "ffa500",
        orangered: "ff4500",
        orchid: "da70d6",
        palegoldenrod: "eee8aa",
        palegreen: "98fb98",
        paleturquoise: "afeeee",
        palevioletred: "d87093",
        papayawhip: "ffefd5",
        peachpuff: "ffdab9",
        peru: "cd853f",
        pink: "ffc0cb",
        plum: "dda0dd",
        powderblue: "b0e0e6",
        purple: "800080",
        red: "ff0000",
        rosybrown: "bc8f8f",
        royalblue: "4169e1",
        saddlebrown: "8b4513",
        salmon: "fa8072",
        sandybrown: "f4a460",
        seagreen: "2e8b57",
        seashell: "fff5ee",
        sienna: "a0522d",
        silver: "c0c0c0",
        skyblue: "87ceeb",
        slateblue: "6a5acd",
        slategray: "708090",
        snow: "fffafa",
        springgreen: "00ff7f",
        steelblue: "4682b4",
        tan: "d2b48c",
        teal: "008080",
        thistle: "d8bfd8",
        tomato: "ff6347",
        turquoise: "40e0d0",
        violet: "ee82ee",
        violetred: "d02090",
        wheat: "f5deb3",
        white: "ffffff",
        whitesmoke: "f5f5f5",
        yellow: "ffff00",
        yellowgreen: "9acd32"
    }, c;
    for (c in a)m == c && (m = a[c]);
    var d = [{
        re: /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,
        example: ["rgb(123, 234, 45)", "rgb(255,234,245)"],
        process: function (b) {
            return [parseInt(b[1]), parseInt(b[2]), parseInt(b[3])]
        }
    }, {
        re: /^(\w{2})(\w{2})(\w{2})$/,
        example: ["#00ff00", "336699"], process: function (b) {
            return [parseInt(b[1], 16), parseInt(b[2], 16), parseInt(b[3], 16)]
        }
    }, {
        re: /^(\w{1})(\w{1})(\w{1})$/, example: ["#fb0", "f0f"], process: function (b) {
            return [parseInt(b[1] + b[1], 16), parseInt(b[2] + b[2], 16), parseInt(b[3] + b[3], 16)]
        }
    }];
    for (c = 0; c < d.length; c++) {
        var b = d[c].process, k = d[c].re.exec(m);
        if (k)channels = b(k), this.r = channels[0], this.g = channels[1], this.b = channels[2], this.ok = !0
    }
    this.r = this.r < 0 || isNaN(this.r) ? 0 : this.r > 255 ? 255 : this.r;
    this.g = this.g < 0 || isNaN(this.g) ? 0 :
        this.g > 255 ? 255 : this.g;
    this.b = this.b < 0 || isNaN(this.b) ? 0 : this.b > 255 ? 255 : this.b;
    this.toRGB = function () {
        return "rgb(" + this.r + ", " + this.g + ", " + this.b + ")"
    };
    this.toHex = function () {
        var b = this.r.toString(16), a = this.g.toString(16), d = this.b.toString(16);
        b.length == 1 && (b = "0" + b);
        a.length == 1 && (a = "0" + a);
        d.length == 1 && (d = "0" + d);
        return "#" + b + a + d
    };
    this.getHelpXML = function () {
        for (var b = [], k = 0; k < d.length; k++)for (var c = d[k].example, j = 0; j < c.length; j++)b[b.length] = c[j];
        for (var h in a)b[b.length] = h;
        c = document.createElement("ul");
        c.setAttribute("id", "rgbcolor-examples");
        for (k = 0; k < b.length; k++)try {
            var l = document.createElement("li"), o = new RGBColor(b[k]), n = document.createElement("div");
            n.style.cssText = "margin: 3px; border: 1px solid black; background:" + o.toHex() + "; color:" + o.toHex();
            n.appendChild(document.createTextNode("test"));
            var q = document.createTextNode(" " + b[k] + " -> " + o.toRGB() + " -> " + o.toHex());
            l.appendChild(n);
            l.appendChild(q);
            c.appendChild(l)
        } catch (p) {
        }
        return c
    }
}
if (!window.console)window.console = {}, window.console.log = function () {
}, window.console.dir = function () {
};
if (!Array.prototype.indexOf)Array.prototype.indexOf = function (m) {
    for (var a = 0; a < this.length; a++)if (this[a] == m)return a;
    return -1
};
(function () {
    function m() {
        var a = {FRAMERATE: 30, MAX_VIRTUAL_PIXELS: 3E4};
        a.init = function (c) {
            a.Definitions = {};
            a.Styles = {};
            a.Animations = [];
            a.Images = [];
            a.ctx = c;
            a.ViewPort = new function () {
                this.viewPorts = [];
                this.Clear = function () {
                    this.viewPorts = []
                };
                this.SetCurrent = function (a, b) {
                    this.viewPorts.push({width: a, height: b})
                };
                this.RemoveCurrent = function () {
                    this.viewPorts.pop()
                };
                this.Current = function () {
                    return this.viewPorts[this.viewPorts.length - 1]
                };
                this.width = function () {
                    return this.Current().width
                };
                this.height = function () {
                    return this.Current().height
                };
                this.ComputeSize = function (a) {
                    return a != null && typeof a == "number" ? a : a == "x" ? this.width() : a == "y" ? this.height() : Math.sqrt(Math.pow(this.width(), 2) + Math.pow(this.height(), 2)) / Math.sqrt(2)
                }
            }
        };
        a.init();
        a.ImagesLoaded = function () {
            for (var c = 0; c < a.Images.length; c++)if (!a.Images[c].loaded)return !1;
            return !0
        };
        a.trim = function (a) {
            return a.replace(/^\s+|\s+$/g, "")
        };
        a.compressSpaces = function (a) {
            return a.replace(/[\s\r\t\n]+/gm, " ")
        };
        a.ajax = function (a) {
            var d;
            return (d = window.XMLHttpRequest ? new XMLHttpRequest : new ActiveXObject("Microsoft.XMLHTTP")) ?
                (d.open("GET", a, !1), d.send(null), d.responseText) : null
        };
        a.parseXml = function (a) {
            if (window.DOMParser)return (new DOMParser).parseFromString(a, "text/xml"); else {
                var a = a.replace(/<!DOCTYPE svg[^>]*>/, ""), d = new ActiveXObject("Microsoft.XMLDOM");
                d.async = "false";
                d.loadXML(a);
                return d
            }
        };
        a.Property = function (c, d) {
            this.name = c;
            this.value = d;
            this.hasValue = function () {
                return this.value != null && this.value !== ""
            };
            this.numValue = function () {
                if (!this.hasValue())return 0;
                var b = parseFloat(this.value);
                (this.value + "").match(/%$/) &&
                (b /= 100);
                return b
            };
            this.valueOrDefault = function (b) {
                return this.hasValue() ? this.value : b
            };
            this.numValueOrDefault = function (b) {
                return this.hasValue() ? this.numValue() : b
            };
            var b = this;
            this.Color = {
                addOpacity: function (d) {
                    var c = b.value;
                    if (d != null && d != "") {
                        var f = new RGBColor(b.value);
                        f.ok && (c = "rgba(" + f.r + ", " + f.g + ", " + f.b + ", " + d + ")")
                    }
                    return new a.Property(b.name, c)
                }
            };
            this.Definition = {
                getDefinition: function () {
                    var d = b.value.replace(/^(url\()?#([^\)]+)\)?$/, "$2");
                    return a.Definitions[d]
                }, isUrl: function () {
                    return b.value.indexOf("url(") ==
                        0
                }, getFillStyle: function (b) {
                    var d = this.getDefinition();
                    return d != null && d.createGradient ? d.createGradient(a.ctx, b) : d != null && d.createPattern ? d.createPattern(a.ctx, b) : null
                }
            };
            this.Length = {
                DPI: function () {
                    return 96
                }, EM: function (b) {
                    var d = 12, c = new a.Property("fontSize", a.Font.Parse(a.ctx.font).fontSize);
                    c.hasValue() && (d = c.Length.toPixels(b));
                    return d
                }, toPixels: function (d) {
                    if (!b.hasValue())return 0;
                    var c = b.value + "";
                    return c.match(/em$/) ? b.numValue() * this.EM(d) : c.match(/ex$/) ? b.numValue() * this.EM(d) / 2 : c.match(/px$/) ?
                        b.numValue() : c.match(/pt$/) ? b.numValue() * 1.25 : c.match(/pc$/) ? b.numValue() * 15 : c.match(/cm$/) ? b.numValue() * this.DPI(d) / 2.54 : c.match(/mm$/) ? b.numValue() * this.DPI(d) / 25.4 : c.match(/in$/) ? b.numValue() * this.DPI(d) : c.match(/%$/) ? b.numValue() * a.ViewPort.ComputeSize(d) : b.numValue()
                }
            };
            this.Time = {
                toMilliseconds: function () {
                    if (!b.hasValue())return 0;
                    var a = b.value + "";
                    if (a.match(/s$/))return b.numValue() * 1E3;
                    a.match(/ms$/);
                    return b.numValue()
                }
            };
            this.Angle = {
                toRadians: function () {
                    if (!b.hasValue())return 0;
                    var a = b.value +
                        "";
                    return a.match(/deg$/) ? b.numValue() * (Math.PI / 180) : a.match(/grad$/) ? b.numValue() * (Math.PI / 200) : a.match(/rad$/) ? b.numValue() : b.numValue() * (Math.PI / 180)
                }
            }
        };
        a.Font = new function () {
            this.Styles = ["normal", "italic", "oblique", "inherit"];
            this.Variants = ["normal", "small-caps", "inherit"];
            this.Weights = "normal,bold,bolder,lighter,100,200,300,400,500,600,700,800,900,inherit".split(",");
            this.CreateFont = function (d, b, c, e, f, g) {
                g = g != null ? this.Parse(g) : this.CreateFont("", "", "", "", "", a.ctx.font);
                return {
                    fontFamily: f ||
                    g.fontFamily,
                    fontSize: e || g.fontSize,
                    fontStyle: d || g.fontStyle,
                    fontWeight: c || g.fontWeight,
                    fontVariant: b || g.fontVariant,
                    toString: function () {
                        return [this.fontStyle, this.fontVariant, this.fontWeight, this.fontSize, this.fontFamily].join(" ")
                    }
                }
            };
            var c = this;
            this.Parse = function (d) {
                for (var b = {}, d = a.trim(a.compressSpaces(d || "")).split(" "), k = !1, e = !1, f = !1, g = !1, j = "", h = 0; h < d.length; h++)if (!e && c.Styles.indexOf(d[h]) != -1) {
                    if (d[h] != "inherit")b.fontStyle = d[h];
                    e = !0
                } else if (!g && c.Variants.indexOf(d[h]) != -1) {
                    if (d[h] != "inherit")b.fontVariant =
                        d[h];
                    e = g = !0
                } else if (!f && c.Weights.indexOf(d[h]) != -1) {
                    if (d[h] != "inherit")b.fontWeight = d[h];
                    e = g = f = !0
                } else if (k)d[h] != "inherit" && (j += d[h]); else {
                    if (d[h] != "inherit")b.fontSize = d[h].split("/")[0];
                    e = g = f = k = !0
                }
                if (j != "")b.fontFamily = j;
                return b
            }
        };
        a.ToNumberArray = function (c) {
            for (var c = a.trim(a.compressSpaces((c || "").replace(/,/g, " "))).split(" "), d = 0; d < c.length; d++)c[d] = parseFloat(c[d]);
            return c
        };
        a.Point = function (a, d) {
            this.x = a;
            this.y = d;
            this.angleTo = function (b) {
                return Math.atan2(b.y - this.y, b.x - this.x)
            };
            this.applyTransform =
                function (b) {
                    var a = this.x * b[1] + this.y * b[3] + b[5];
                    this.x = this.x * b[0] + this.y * b[2] + b[4];
                    this.y = a
                }
        };
        a.CreatePoint = function (c) {
            c = a.ToNumberArray(c);
            return new a.Point(c[0], c[1])
        };
        a.CreatePath = function (c) {
            for (var c = a.ToNumberArray(c), d = [], b = 0; b < c.length; b += 2)d.push(new a.Point(c[b], c[b + 1]));
            return d
        };
        a.BoundingBox = function (a, d, b, k) {
            this.y2 = this.x2 = this.y1 = this.x1 = Number.NaN;
            this.x = function () {
                return this.x1
            };
            this.y = function () {
                return this.y1
            };
            this.width = function () {
                return this.x2 - this.x1
            };
            this.height = function () {
                return this.y2 -
                    this.y1
            };
            this.addPoint = function (b, a) {
                if (b != null) {
                    if (isNaN(this.x1) || isNaN(this.x2))this.x2 = this.x1 = b;
                    if (b < this.x1)this.x1 = b;
                    if (b > this.x2)this.x2 = b
                }
                if (a != null) {
                    if (isNaN(this.y1) || isNaN(this.y2))this.y2 = this.y1 = a;
                    if (a < this.y1)this.y1 = a;
                    if (a > this.y2)this.y2 = a
                }
            };
            this.addX = function (b) {
                this.addPoint(b, null)
            };
            this.addY = function (b) {
                this.addPoint(null, b)
            };
            this.addBoundingBox = function (b) {
                this.addPoint(b.x1, b.y1);
                this.addPoint(b.x2, b.y2)
            };
            this.addQuadraticCurve = function (b, a, d, c, k, l) {
                d = b + 2 / 3 * (d - b);
                c = a + 2 / 3 * (c -
                    a);
                this.addBezierCurve(b, a, d, d + 1 / 3 * (k - b), c, c + 1 / 3 * (l - a), k, l)
            };
            this.addBezierCurve = function (b, a, d, c, k, l, o, n) {
                var q = [b, a], p = [d, c], t = [k, l], m = [o, n];
                this.addPoint(q[0], q[1]);
                this.addPoint(m[0], m[1]);
                for (i = 0; i <= 1; i++)b = function (b) {
                    return Math.pow(1 - b, 3) * q[i] + 3 * Math.pow(1 - b, 2) * b * p[i] + 3 * (1 - b) * Math.pow(b, 2) * t[i] + Math.pow(b, 3) * m[i]
                }, a = 6 * q[i] - 12 * p[i] + 6 * t[i], d = -3 * q[i] + 9 * p[i] - 9 * t[i] + 3 * m[i], c = 3 * p[i] - 3 * q[i], d == 0 ? a != 0 && (a = -c / a, 0 < a && a < 1 && (i == 0 && this.addX(b(a)), i == 1 && this.addY(b(a)))) : (c = Math.pow(a, 2) - 4 * c * d, c < 0 || (k =
                    (-a + Math.sqrt(c)) / (2 * d), 0 < k && k < 1 && (i == 0 && this.addX(b(k)), i == 1 && this.addY(b(k))), a = (-a - Math.sqrt(c)) / (2 * d), 0 < a && a < 1 && (i == 0 && this.addX(b(a)), i == 1 && this.addY(b(a)))))
            };
            this.isPointInBox = function (b, a) {
                return this.x1 <= b && b <= this.x2 && this.y1 <= a && a <= this.y2
            };
            this.addPoint(a, d);
            this.addPoint(b, k)
        };
        a.Transform = function (c) {
            var d = this;
            this.Type = {};
            this.Type.translate = function (b) {
                this.p = a.CreatePoint(b);
                this.apply = function (b) {
                    b.translate(this.p.x || 0, this.p.y || 0)
                };
                this.applyToPoint = function (b) {
                    b.applyTransform([1,
                        0, 0, 1, this.p.x || 0, this.p.y || 0])
                }
            };
            this.Type.rotate = function (b) {
                b = a.ToNumberArray(b);
                this.angle = new a.Property("angle", b[0]);
                this.cx = b[1] || 0;
                this.cy = b[2] || 0;
                this.apply = function (b) {
                    b.translate(this.cx, this.cy);
                    b.rotate(this.angle.Angle.toRadians());
                    b.translate(-this.cx, -this.cy)
                };
                this.applyToPoint = function (b) {
                    var a = this.angle.Angle.toRadians();
                    b.applyTransform([1, 0, 0, 1, this.p.x || 0, this.p.y || 0]);
                    b.applyTransform([Math.cos(a), Math.sin(a), -Math.sin(a), Math.cos(a), 0, 0]);
                    b.applyTransform([1, 0, 0, 1, -this.p.x ||
                    0, -this.p.y || 0])
                }
            };
            this.Type.scale = function (b) {
                this.p = a.CreatePoint(b);
                this.apply = function (b) {
                    b.scale(this.p.x || 1, this.p.y || this.p.x || 1)
                };
                this.applyToPoint = function (b) {
                    b.applyTransform([this.p.x || 0, 0, 0, this.p.y || 0, 0, 0])
                }
            };
            this.Type.matrix = function (b) {
                this.m = a.ToNumberArray(b);
                this.apply = function (b) {
                    b.transform(this.m[0], this.m[1], this.m[2], this.m[3], this.m[4], this.m[5])
                };
                this.applyToPoint = function (b) {
                    b.applyTransform(this.m)
                }
            };
            this.Type.SkewBase = function (b) {
                this.base = d.Type.matrix;
                this.base(b);
                this.angle =
                    new a.Property("angle", b)
            };
            this.Type.SkewBase.prototype = new this.Type.matrix;
            this.Type.skewX = function (b) {
                this.base = d.Type.SkewBase;
                this.base(b);
                this.m = [1, 0, Math.tan(this.angle.Angle.toRadians()), 1, 0, 0]
            };
            this.Type.skewX.prototype = new this.Type.SkewBase;
            this.Type.skewY = function (b) {
                this.base = d.Type.SkewBase;
                this.base(b);
                this.m = [1, Math.tan(this.angle.Angle.toRadians()), 0, 1, 0, 0]
            };
            this.Type.skewY.prototype = new this.Type.SkewBase;
            this.transforms = [];
            this.apply = function (b) {
                for (var a = 0; a < this.transforms.length; a++)this.transforms[a].apply(b)
            };
            this.applyToPoint = function (b) {
                for (var a = 0; a < this.transforms.length; a++)this.transforms[a].applyToPoint(b)
            };
            for (var c = a.trim(a.compressSpaces(c)).split(/\s(?=[a-z])/), b = 0; b < c.length; b++) {
                var k = c[b].split("(")[0], e = c[b].split("(")[1].replace(")", "");
                this.transforms.push(new this.Type[k](e))
            }
        };
        a.AspectRatio = function (c, d, b, k, e, f, g, j, h, l) {
            var d = a.compressSpaces(d), d = d.replace(/^defer\s/, ""), o = d.split(" ")[0] || "xMidYMid", d = d.split(" ")[1] || "meet", n = b / k, q = e / f, p = Math.min(n, q), m = Math.max(n, q);
            d == "meet" && (k *=
                p, f *= p);
            d == "slice" && (k *= m, f *= m);
            h = new a.Property("refX", h);
            l = new a.Property("refY", l);
            h.hasValue() && l.hasValue() ? c.translate(-p * h.Length.toPixels("x"), -p * l.Length.toPixels("y")) : (o.match(/^xMid/) && (d == "meet" && p == q || d == "slice" && m == q) && c.translate(b / 2 - k / 2, 0), o.match(/YMid$/) && (d == "meet" && p == n || d == "slice" && m == n) && c.translate(0, e / 2 - f / 2), o.match(/^xMax/) && (d == "meet" && p == q || d == "slice" && m == q) && c.translate(b - k, 0), o.match(/YMax$/) && (d == "meet" && p == n || d == "slice" && m == n) && c.translate(0, e - f));
            o == "none" ? c.scale(n,
                q) : d == "meet" ? c.scale(p, p) : d == "slice" && c.scale(m, m);
            c.translate(g == null ? 0 : -g, j == null ? 0 : -j)
        };
        a.Element = {};
        a.Element.ElementBase = function (c) {
            this.attributes = {};
            this.styles = {};
            this.children = [];
            this.attribute = function (b, d) {
                var c = this.attributes[b];
                if (c != null)return c;
                c = new a.Property(b, "");
                d == !0 && (this.attributes[b] = c);
                return c
            };
            this.style = function (b, d) {
                var c = this.styles[b];
                if (c != null)return c;
                c = this.attribute(b);
                if (c != null && c.hasValue())return c;
                c = this.parent;
                if (c != null && (c = c.style(b), c != null && c.hasValue()))return c;
                c = new a.Property(b, "");
                d == !0 && (this.styles[b] = c);
                return c
            };
            this.render = function (b) {
                if (this.style("display").value != "none" && this.attribute("visibility").value != "hidden") {
                    b.save();
                    this.setContext(b);
                    if (this.attribute("mask").hasValue()) {
                        var a = this.attribute("mask").Definition.getDefinition();
                        a != null && a.apply(b, this)
                    } else this.style("filter").hasValue() ? (a = this.style("filter").Definition.getDefinition(), a != null && a.apply(b, this)) : this.renderChildren(b);
                    this.clearContext(b);
                    b.restore()
                }
            };
            this.setContext =
                function () {
                };
            this.clearContext = function () {
            };
            this.renderChildren = function (b) {
                for (var a = 0; a < this.children.length; a++)this.children[a].render(b)
            };
            this.addChild = function (b, d) {
                var c = b;
                d && (c = a.CreateElement(b));
                c.parent = this;
                this.children.push(c)
            };
            if (c != null && c.nodeType == 1) {
                for (var d = 0; d < c.childNodes.length; d++) {
                    var b = c.childNodes[d];
                    b.nodeType == 1 && this.addChild(b, !0)
                }
                for (d = 0; d < c.attributes.length; d++)b = c.attributes[d], this.attributes[b.nodeName] = new a.Property(b.nodeName, b.nodeValue);
                b = a.Styles[c.nodeName];
                if (b != null)for (var k in b)this.styles[k] = b[k];
                if (this.attribute("class").hasValue())for (var d = a.compressSpaces(this.attribute("class").value).split(" "), e = 0; e < d.length; e++) {
                    b = a.Styles["." + d[e]];
                    if (b != null)for (k in b)this.styles[k] = b[k];
                    b = a.Styles[c.nodeName + "." + d[e]];
                    if (b != null)for (k in b)this.styles[k] = b[k]
                }
                if (this.attribute("style").hasValue()) {
                    b = this.attribute("style").value.split(";");
                    for (d = 0; d < b.length; d++)a.trim(b[d]) != "" && (c = b[d].split(":"), k = a.trim(c[0]), c = a.trim(c[1]), this.styles[k] = new a.Property(k,
                        c))
                }
                this.attribute("id").hasValue() && a.Definitions[this.attribute("id").value] == null && (a.Definitions[this.attribute("id").value] = this)
            }
        };
        a.Element.RenderedElementBase = function (c) {
            this.base = a.Element.ElementBase;
            this.base(c);
            this.setContext = function (d) {
                if (this.style("fill").Definition.isUrl()) {
                    var b = this.style("fill").Definition.getFillStyle(this);
                    if (b != null)d.fillStyle = b
                } else if (this.style("fill").hasValue())b = this.style("fill"), this.style("fill-opacity").hasValue() && (b = b.Color.addOpacity(this.style("fill-opacity").value)),
                    d.fillStyle = b.value == "none" ? "rgba(0,0,0,0)" : b.value;
                if (this.style("stroke").Definition.isUrl()) {
                    if (b = this.style("stroke").Definition.getFillStyle(this), b != null)d.strokeStyle = b
                } else if (this.style("stroke").hasValue())b = this.style("stroke"), this.style("stroke-opacity").hasValue() && (b = b.Color.addOpacity(this.style("stroke-opacity").value)), d.strokeStyle = b.value == "none" ? "rgba(0,0,0,0)" : b.value;
                if (this.style("stroke-width").hasValue())d.lineWidth = this.style("stroke-width").Length.toPixels();
                if (this.style("stroke-linecap").hasValue())d.lineCap =
                    this.style("stroke-linecap").value;
                if (this.style("stroke-linejoin").hasValue())d.lineJoin = this.style("stroke-linejoin").value;
                if (this.style("stroke-miterlimit").hasValue())d.miterLimit = this.style("stroke-miterlimit").value;
                if (typeof d.font != "undefined")d.font = a.Font.CreateFont(this.style("font-style").value, this.style("font-variant").value, this.style("font-weight").value, this.style("font-size").hasValue() ? this.style("font-size").Length.toPixels() + "px" : "", this.style("font-family").value).toString();
                this.attribute("transform").hasValue() && (new a.Transform(this.attribute("transform").value)).apply(d);
                this.attribute("clip-path").hasValue() && (b = this.attribute("clip-path").Definition.getDefinition(), b != null && b.apply(d));
                if (this.style("opacity").hasValue())d.globalAlpha = this.style("opacity").numValue()
            }
        };
        a.Element.RenderedElementBase.prototype = new a.Element.ElementBase;
        a.Element.PathElementBase = function (c) {
            this.base = a.Element.RenderedElementBase;
            this.base(c);
            this.path = function (d) {
                d != null && d.beginPath();
                return new a.BoundingBox
            };
            this.renderChildren = function (d) {
                this.path(d);
                a.Mouse.checkPath(this, d);
                d.fillStyle != "" && d.fill();
                d.strokeStyle != "" && d.stroke();
                var b = this.getMarkers();
                if (b != null) {
                    if (this.style("marker-start").Definition.isUrl()) {
                        var c = this.style("marker-start").Definition.getDefinition();
                        c.render(d, b[0][0], b[0][1])
                    }
                    if (this.style("marker-mid").Definition.isUrl())for (var c = this.style("marker-mid").Definition.getDefinition(), e = 1; e < b.length - 1; e++)c.render(d, b[e][0], b[e][1]);
                    this.style("marker-end").Definition.isUrl() &&
                    (c = this.style("marker-end").Definition.getDefinition(), c.render(d, b[b.length - 1][0], b[b.length - 1][1]))
                }
            };
            this.getBoundingBox = function () {
                return this.path()
            };
            this.getMarkers = function () {
                return null
            }
        };
        a.Element.PathElementBase.prototype = new a.Element.RenderedElementBase;
        a.Element.svg = function (c) {
            this.base = a.Element.RenderedElementBase;
            this.base(c);
            this.baseClearContext = this.clearContext;
            this.clearContext = function (d) {
                this.baseClearContext(d);
                a.ViewPort.RemoveCurrent()
            };
            this.baseSetContext = this.setContext;
            this.setContext = function (d) {
                d.strokeStyle = "rgba(0,0,0,0)";
                d.lineCap = "butt";
                d.lineJoin = "miter";
                d.miterLimit = 4;
                this.baseSetContext(d);
                this.attribute("x").hasValue() && this.attribute("y").hasValue() && d.translate(this.attribute("x").Length.toPixels("x"), this.attribute("y").Length.toPixels("y"));
                var b = a.ViewPort.width(), c = a.ViewPort.height();
                if (typeof this.root == "undefined" && this.attribute("width").hasValue() && this.attribute("height").hasValue()) {
                    var b = this.attribute("width").Length.toPixels("x"), c = this.attribute("height").Length.toPixels("y"),
                        e = 0, f = 0;
                    this.attribute("refX").hasValue() && this.attribute("refY").hasValue() && (e = -this.attribute("refX").Length.toPixels("x"), f = -this.attribute("refY").Length.toPixels("y"));
                    d.beginPath();
                    d.moveTo(e, f);
                    d.lineTo(b, f);
                    d.lineTo(b, c);
                    d.lineTo(e, c);
                    d.closePath();
                    d.clip()
                }
                a.ViewPort.SetCurrent(b, c);
                if (this.attribute("viewBox").hasValue()) {
                    var e = a.ToNumberArray(this.attribute("viewBox").value), f = e[0], g = e[1], b = e[2], c = e[3];
                    a.AspectRatio(d, this.attribute("preserveAspectRatio").value, a.ViewPort.width(), b, a.ViewPort.height(),
                        c, f, g, this.attribute("refX").value, this.attribute("refY").value);
                    a.ViewPort.RemoveCurrent();
                    a.ViewPort.SetCurrent(e[2], e[3])
                }
            }
        };
        a.Element.svg.prototype = new a.Element.RenderedElementBase;
        a.Element.rect = function (c) {
            this.base = a.Element.PathElementBase;
            this.base(c);
            this.path = function (d) {
                var b = this.attribute("x").Length.toPixels("x"), c = this.attribute("y").Length.toPixels("y"), e = this.attribute("width").Length.toPixels("x"), f = this.attribute("height").Length.toPixels("y"), g = this.attribute("rx").Length.toPixels("x"),
                    j = this.attribute("ry").Length.toPixels("y");
                this.attribute("rx").hasValue() && !this.attribute("ry").hasValue() && (j = g);
                this.attribute("ry").hasValue() && !this.attribute("rx").hasValue() && (g = j);
                d != null && (d.beginPath(), d.moveTo(b + g, c), d.lineTo(b + e - g, c), d.quadraticCurveTo(b + e, c, b + e, c + j), d.lineTo(b + e, c + f - j), d.quadraticCurveTo(b + e, c + f, b + e - g, c + f), d.lineTo(b + g, c + f), d.quadraticCurveTo(b, c + f, b, c + f - j), d.lineTo(b, c + j), d.quadraticCurveTo(b, c, b + g, c), d.closePath());
                return new a.BoundingBox(b, c, b + e, c + f)
            }
        };
        a.Element.rect.prototype =
            new a.Element.PathElementBase;
        a.Element.circle = function (c) {
            this.base = a.Element.PathElementBase;
            this.base(c);
            this.path = function (d) {
                var b = this.attribute("cx").Length.toPixels("x"), c = this.attribute("cy").Length.toPixels("y"), e = this.attribute("r").Length.toPixels();
                d != null && (d.beginPath(), d.arc(b, c, e, 0, Math.PI * 2, !0), d.closePath());
                return new a.BoundingBox(b - e, c - e, b + e, c + e)
            }
        };
        a.Element.circle.prototype = new a.Element.PathElementBase;
        a.Element.ellipse = function (c) {
            this.base = a.Element.PathElementBase;
            this.base(c);
            this.path = function (d) {
                var b = 4 * ((Math.sqrt(2) - 1) / 3), c = this.attribute("rx").Length.toPixels("x"), e = this.attribute("ry").Length.toPixels("y"), f = this.attribute("cx").Length.toPixels("x"), g = this.attribute("cy").Length.toPixels("y");
                d != null && (d.beginPath(), d.moveTo(f, g - e), d.bezierCurveTo(f + b * c, g - e, f + c, g - b * e, f + c, g), d.bezierCurveTo(f + c, g + b * e, f + b * c, g + e, f, g + e), d.bezierCurveTo(f - b * c, g + e, f - c, g + b * e, f - c, g), d.bezierCurveTo(f - c, g - b * e, f - b * c, g - e, f, g - e), d.closePath());
                return new a.BoundingBox(f - c, g - e, f + c, g + e)
            }
        };
        a.Element.ellipse.prototype =
            new a.Element.PathElementBase;
        a.Element.line = function (c) {
            this.base = a.Element.PathElementBase;
            this.base(c);
            this.getPoints = function () {
                return [new a.Point(this.attribute("x1").Length.toPixels("x"), this.attribute("y1").Length.toPixels("y")), new a.Point(this.attribute("x2").Length.toPixels("x"), this.attribute("y2").Length.toPixels("y"))]
            };
            this.path = function (d) {
                var b = this.getPoints();
                d != null && (d.beginPath(), d.moveTo(b[0].x, b[0].y), d.lineTo(b[1].x, b[1].y));
                return new a.BoundingBox(b[0].x, b[0].y, b[1].x, b[1].y)
            };
            this.getMarkers = function () {
                var a = this.getPoints(), b = a[0].angleTo(a[1]);
                return [[a[0], b], [a[1], b]]
            }
        };
        a.Element.line.prototype = new a.Element.PathElementBase;
        a.Element.polyline = function (c) {
            this.base = a.Element.PathElementBase;
            this.base(c);
            this.points = a.CreatePath(this.attribute("points").value);
            this.path = function (d) {
                var b = new a.BoundingBox(this.points[0].x, this.points[0].y);
                d != null && (d.beginPath(), d.moveTo(this.points[0].x, this.points[0].y));
                for (var c = 1; c < this.points.length; c++)b.addPoint(this.points[c].x,
                    this.points[c].y), d != null && d.lineTo(this.points[c].x, this.points[c].y);
                return b
            };
            this.getMarkers = function () {
                for (var a = [], b = 0; b < this.points.length - 1; b++)a.push([this.points[b], this.points[b].angleTo(this.points[b + 1])]);
                a.push([this.points[this.points.length - 1], a[a.length - 1][1]]);
                return a
            }
        };
        a.Element.polyline.prototype = new a.Element.PathElementBase;
        a.Element.polygon = function (c) {
            this.base = a.Element.polyline;
            this.base(c);
            this.basePath = this.path;
            this.path = function (a) {
                var b = this.basePath(a);
                a != null && (a.lineTo(this.points[0].x,
                    this.points[0].y), a.closePath());
                return b
            }
        };
        a.Element.polygon.prototype = new a.Element.polyline;
        a.Element.path = function (c) {
            this.base = a.Element.PathElementBase;
            this.base(c);
            c = this.attribute("d").value;
            c = c.replace(/,/gm, " ");
            c = c.replace(/([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm, "$1 $2");
            c = c.replace(/([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm, "$1 $2");
            c = c.replace(/([MmZzLlHhVvCcSsQqTtAa])([^\s])/gm, "$1 $2");
            c = c.replace(/([^\s])([MmZzLlHhVvCcSsQqTtAa])/gm, "$1 $2");
            c = c.replace(/([0-9])([+\-])/gm,
                "$1 $2");
            c = c.replace(/(\.[0-9]*)(\.)/gm, "$1 $2");
            c = c.replace(/([Aa](\s+[0-9]+){3})\s+([01])\s*([01])/gm, "$1 $3 $4 ");
            c = a.compressSpaces(c);
            c = a.trim(c);
            this.PathParser = new function (d) {
                this.tokens = d.split(" ");
                this.reset = function () {
                    this.i = -1;
                    this.previousCommand = this.command = "";
                    this.start = new a.Point(0, 0);
                    this.control = new a.Point(0, 0);
                    this.current = new a.Point(0, 0);
                    this.points = [];
                    this.angles = []
                };
                this.isEnd = function () {
                    return this.i >= this.tokens.length - 1
                };
                this.isCommandOrEnd = function () {
                    return this.isEnd() ?
                        !0 : this.tokens[this.i + 1].match(/^[A-Za-z]$/) != null
                };
                this.isRelativeCommand = function () {
                    return this.command == this.command.toLowerCase()
                };
                this.getToken = function () {
                    this.i += 1;
                    return this.tokens[this.i]
                };
                this.getScalar = function () {
                    return parseFloat(this.getToken())
                };
                this.nextCommand = function () {
                    this.previousCommand = this.command;
                    this.command = this.getToken()
                };
                this.getPoint = function () {
                    return this.makeAbsolute(new a.Point(this.getScalar(), this.getScalar()))
                };
                this.getAsControlPoint = function () {
                    var b = this.getPoint();
                    return this.control = b
                };
                this.getAsCurrentPoint = function () {
                    var b = this.getPoint();
                    return this.current = b
                };
                this.getReflectedControlPoint = function () {
                    return this.previousCommand.toLowerCase() != "c" && this.previousCommand.toLowerCase() != "s" ? this.current : new a.Point(2 * this.current.x - this.control.x, 2 * this.current.y - this.control.y)
                };
                this.makeAbsolute = function (b) {
                    if (this.isRelativeCommand())b.x = this.current.x + b.x, b.y = this.current.y + b.y;
                    return b
                };
                this.addMarker = function (b, a, d) {
                    d != null && this.angles.length > 0 && this.angles[this.angles.length -
                    1] == null && (this.angles[this.angles.length - 1] = this.points[this.points.length - 1].angleTo(d));
                    this.addMarkerAngle(b, a == null ? null : a.angleTo(b))
                };
                this.addMarkerAngle = function (b, a) {
                    this.points.push(b);
                    this.angles.push(a)
                };
                this.getMarkerPoints = function () {
                    return this.points
                };
                this.getMarkerAngles = function () {
                    for (var b = 0; b < this.angles.length; b++)if (this.angles[b] == null)for (var a = b + 1; a < this.angles.length; a++)if (this.angles[a] != null) {
                        this.angles[b] = this.angles[a];
                        break
                    }
                    return this.angles
                }
            }(c);
            this.path = function (d) {
                var b =
                    this.PathParser;
                b.reset();
                var c = new a.BoundingBox;
                for (d != null && d.beginPath(); !b.isEnd();)switch (b.nextCommand(), b.command.toUpperCase()) {
                    case "M":
                        var e = b.getAsCurrentPoint();
                        b.addMarker(e);
                        c.addPoint(e.x, e.y);
                        d != null && d.moveTo(e.x, e.y);
                        for (b.start = b.current; !b.isCommandOrEnd();)e = b.getAsCurrentPoint(), b.addMarker(e, b.start), c.addPoint(e.x, e.y), d != null && d.lineTo(e.x, e.y);
                        break;
                    case "L":
                        for (; !b.isCommandOrEnd();) {
                            var f = b.current, e = b.getAsCurrentPoint();
                            b.addMarker(e, f);
                            c.addPoint(e.x, e.y);
                            d != null &&
                            d.lineTo(e.x, e.y)
                        }
                        break;
                    case "H":
                        for (; !b.isCommandOrEnd();)e = new a.Point((b.isRelativeCommand() ? b.current.x : 0) + b.getScalar(), b.current.y), b.addMarker(e, b.current), b.current = e, c.addPoint(b.current.x, b.current.y), d != null && d.lineTo(b.current.x, b.current.y);
                        break;
                    case "V":
                        for (; !b.isCommandOrEnd();)e = new a.Point(b.current.x, (b.isRelativeCommand() ? b.current.y : 0) + b.getScalar()), b.addMarker(e, b.current), b.current = e, c.addPoint(b.current.x, b.current.y), d != null && d.lineTo(b.current.x, b.current.y);
                        break;
                    case "C":
                        for (; !b.isCommandOrEnd();) {
                            var g =
                                b.current, f = b.getPoint(), j = b.getAsControlPoint(), e = b.getAsCurrentPoint();
                            b.addMarker(e, j, f);
                            c.addBezierCurve(g.x, g.y, f.x, f.y, j.x, j.y, e.x, e.y);
                            d != null && d.bezierCurveTo(f.x, f.y, j.x, j.y, e.x, e.y)
                        }
                        break;
                    case "S":
                        for (; !b.isCommandOrEnd();)g = b.current, f = b.getReflectedControlPoint(), j = b.getAsControlPoint(), e = b.getAsCurrentPoint(), b.addMarker(e, j, f), c.addBezierCurve(g.x, g.y, f.x, f.y, j.x, j.y, e.x, e.y), d != null && d.bezierCurveTo(f.x, f.y, j.x, j.y, e.x, e.y);
                        break;
                    case "Q":
                        for (; !b.isCommandOrEnd();)g = b.current, j = b.getAsControlPoint(),
                            e = b.getAsCurrentPoint(), b.addMarker(e, j, j), c.addQuadraticCurve(g.x, g.y, j.x, j.y, e.x, e.y), d != null && d.quadraticCurveTo(j.x, j.y, e.x, e.y);
                        break;
                    case "T":
                        for (; !b.isCommandOrEnd();)g = b.current, j = b.getReflectedControlPoint(), b.control = j, e = b.getAsCurrentPoint(), b.addMarker(e, j, j), c.addQuadraticCurve(g.x, g.y, j.x, j.y, e.x, e.y), d != null && d.quadraticCurveTo(j.x, j.y, e.x, e.y);
                        break;
                    case "A":
                        for (; !b.isCommandOrEnd();) {
                            var g = b.current, h = b.getScalar(), l = b.getScalar(), f = b.getScalar() * (Math.PI / 180), o = b.getScalar(), j = b.getScalar(),
                                e = b.getAsCurrentPoint(), n = new a.Point(Math.cos(f) * (g.x - e.x) / 2 + Math.sin(f) * (g.y - e.y) / 2, -Math.sin(f) * (g.x - e.x) / 2 + Math.cos(f) * (g.y - e.y) / 2), q = Math.pow(n.x, 2) / Math.pow(h, 2) + Math.pow(n.y, 2) / Math.pow(l, 2);
                            q > 1 && (h *= Math.sqrt(q), l *= Math.sqrt(q));
                            o = (o == j ? -1 : 1) * Math.sqrt((Math.pow(h, 2) * Math.pow(l, 2) - Math.pow(h, 2) * Math.pow(n.y, 2) - Math.pow(l, 2) * Math.pow(n.x, 2)) / (Math.pow(h, 2) * Math.pow(n.y, 2) + Math.pow(l, 2) * Math.pow(n.x, 2)));
                            isNaN(o) && (o = 0);
                            var p = new a.Point(o * h * n.y / l, o * -l * n.x / h), g = new a.Point((g.x + e.x) / 2 + Math.cos(f) *
                                p.x - Math.sin(f) * p.y, (g.y + e.y) / 2 + Math.sin(f) * p.x + Math.cos(f) * p.y), m = function (b, a) {
                                return (b[0] * a[0] + b[1] * a[1]) / (Math.sqrt(Math.pow(b[0], 2) + Math.pow(b[1], 2)) * Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2)))
                            }, s = function (b, a) {
                                return (b[0] * a[1] < b[1] * a[0] ? -1 : 1) * Math.acos(m(b, a))
                            }, o = s([1, 0], [(n.x - p.x) / h, (n.y - p.y) / l]), q = [(n.x - p.x) / h, (n.y - p.y) / l], p = [(-n.x - p.x) / h, (-n.y - p.y) / l], n = s(q, p);
                            if (m(q, p) <= -1)n = Math.PI;
                            m(q, p) >= 1 && (n = 0);
                            j == 0 && n > 0 && (n -= 2 * Math.PI);
                            j == 1 && n < 0 && (n += 2 * Math.PI);
                            q = new a.Point(g.x - h * Math.cos((o + n) /
                                    2), g.y - l * Math.sin((o + n) / 2));
                            b.addMarkerAngle(q, (o + n) / 2 + (j == 0 ? 1 : -1) * Math.PI / 2);
                            b.addMarkerAngle(e, n + (j == 0 ? 1 : -1) * Math.PI / 2);
                            c.addPoint(e.x, e.y);
                            d != null && (m = h > l ? h : l, e = h > l ? 1 : h / l, h = h > l ? l / h : 1, d.translate(g.x, g.y), d.rotate(f), d.scale(e, h), d.arc(0, 0, m, o, o + n, 1 - j), d.scale(1 / e, 1 / h), d.rotate(-f), d.translate(-g.x, -g.y))
                        }
                        break;
                    case "Z":
                        d != null && d.closePath(), b.current = b.start
                }
                return c
            };
            this.getMarkers = function () {
                for (var a = this.PathParser.getMarkerPoints(), b = this.PathParser.getMarkerAngles(), c = [], e = 0; e < a.length; e++)c.push([a[e],
                    b[e]]);
                return c
            }
        };
        a.Element.path.prototype = new a.Element.PathElementBase;
        a.Element.pattern = function (c) {
            this.base = a.Element.ElementBase;
            this.base(c);
            this.createPattern = function (d) {
                var b = new a.Element.svg;
                b.attributes.viewBox = new a.Property("viewBox", this.attribute("viewBox").value);
                b.attributes.x = new a.Property("x", this.attribute("x").value);
                b.attributes.y = new a.Property("y", this.attribute("y").value);
                b.attributes.width = new a.Property("width", this.attribute("width").value);
                b.attributes.height = new a.Property("height",
                    this.attribute("height").value);
                b.children = this.children;
                var c = document.createElement("canvas");
                c.width = this.attribute("width").Length.toPixels("x");
                c.height = this.attribute("height").Length.toPixels("y");
                b.render(c.getContext("2d"));
                return d.createPattern(c, "repeat")
            }
        };
        a.Element.pattern.prototype = new a.Element.ElementBase;
        a.Element.marker = function (c) {
            this.base = a.Element.ElementBase;
            this.base(c);
            this.baseRender = this.render;
            this.render = function (d, b, c) {
                d.translate(b.x, b.y);
                this.attribute("orient").valueOrDefault("auto") ==
                "auto" && d.rotate(c);
                this.attribute("markerUnits").valueOrDefault("strokeWidth") == "strokeWidth" && d.scale(d.lineWidth, d.lineWidth);
                d.save();
                var e = new a.Element.svg;
                e.attributes.viewBox = new a.Property("viewBox", this.attribute("viewBox").value);
                e.attributes.refX = new a.Property("refX", this.attribute("refX").value);
                e.attributes.refY = new a.Property("refY", this.attribute("refY").value);
                e.attributes.width = new a.Property("width", this.attribute("markerWidth").value);
                e.attributes.height = new a.Property("height",
                    this.attribute("markerHeight").value);
                e.attributes.fill = new a.Property("fill", this.attribute("fill").valueOrDefault("black"));
                e.attributes.stroke = new a.Property("stroke", this.attribute("stroke").valueOrDefault("none"));
                e.children = this.children;
                e.render(d);
                d.restore();
                this.attribute("markerUnits").valueOrDefault("strokeWidth") == "strokeWidth" && d.scale(1 / d.lineWidth, 1 / d.lineWidth);
                this.attribute("orient").valueOrDefault("auto") == "auto" && d.rotate(-c);
                d.translate(-b.x, -b.y)
            }
        };
        a.Element.marker.prototype =
            new a.Element.ElementBase;
        a.Element.defs = function (c) {
            this.base = a.Element.ElementBase;
            this.base(c);
            this.render = function () {
            }
        };
        a.Element.defs.prototype = new a.Element.ElementBase;
        a.Element.GradientBase = function (c) {
            this.base = a.Element.ElementBase;
            this.base(c);
            this.gradientUnits = this.attribute("gradientUnits").valueOrDefault("objectBoundingBox");
            this.stops = [];
            for (c = 0; c < this.children.length; c++)this.stops.push(this.children[c]);
            this.getGradient = function () {
            };
            this.createGradient = function (d, b) {
                var c = this;
                this.attribute("xlink:href").hasValue() &&
                (c = this.attribute("xlink:href").Definition.getDefinition());
                for (var e = this.getGradient(d, b), f = 0; f < c.stops.length; f++)e.addColorStop(c.stops[f].offset, c.stops[f].color);
                if (this.attribute("gradientTransform").hasValue()) {
                    c = a.ViewPort.viewPorts[0];
                    f = new a.Element.rect;
                    f.attributes.x = new a.Property("x", -a.MAX_VIRTUAL_PIXELS / 3);
                    f.attributes.y = new a.Property("y", -a.MAX_VIRTUAL_PIXELS / 3);
                    f.attributes.width = new a.Property("width", a.MAX_VIRTUAL_PIXELS);
                    f.attributes.height = new a.Property("height", a.MAX_VIRTUAL_PIXELS);
                    var g = new a.Element.g;
                    g.attributes.transform = new a.Property("transform", this.attribute("gradientTransform").value);
                    g.children = [f];
                    f = new a.Element.svg;
                    f.attributes.x = new a.Property("x", 0);
                    f.attributes.y = new a.Property("y", 0);
                    f.attributes.width = new a.Property("width", c.width);
                    f.attributes.height = new a.Property("height", c.height);
                    f.children = [g];
                    g = document.createElement("canvas");
                    g.width = c.width;
                    g.height = c.height;
                    c = g.getContext("2d");
                    c.fillStyle = e;
                    f.render(c);
                    return c.createPattern(g, "no-repeat")
                }
                return e
            }
        };
        a.Element.GradientBase.prototype = new a.Element.ElementBase;
        a.Element.linearGradient = function (c) {
            this.base = a.Element.GradientBase;
            this.base(c);
            this.getGradient = function (a, b) {
                var c = b.getBoundingBox(), e = this.gradientUnits == "objectBoundingBox" ? c.x() + c.width() * this.attribute("x1").numValue() : this.attribute("x1").Length.toPixels("x"), f = this.gradientUnits == "objectBoundingBox" ? c.y() + c.height() * this.attribute("y1").numValue() : this.attribute("y1").Length.toPixels("y"), g = this.gradientUnits == "objectBoundingBox" ?
                c.x() + c.width() * this.attribute("x2").numValue() : this.attribute("x2").Length.toPixels("x"), c = this.gradientUnits == "objectBoundingBox" ? c.y() + c.height() * this.attribute("y2").numValue() : this.attribute("y2").Length.toPixels("y");
                return a.createLinearGradient(e, f, g, c)
            }
        };
        a.Element.linearGradient.prototype = new a.Element.GradientBase;
        a.Element.radialGradient = function (c) {
            this.base = a.Element.GradientBase;
            this.base(c);
            this.getGradient = function (a, b) {
                var c = b.getBoundingBox(), e = this.gradientUnits == "objectBoundingBox" ?
                c.x() + c.width() * this.attribute("cx").numValue() : this.attribute("cx").Length.toPixels("x"), f = this.gradientUnits == "objectBoundingBox" ? c.y() + c.height() * this.attribute("cy").numValue() : this.attribute("cy").Length.toPixels("y"), g = e, j = f;
                this.attribute("fx").hasValue() && (g = this.gradientUnits == "objectBoundingBox" ? c.x() + c.width() * this.attribute("fx").numValue() : this.attribute("fx").Length.toPixels("x"));
                this.attribute("fy").hasValue() && (j = this.gradientUnits == "objectBoundingBox" ? c.y() + c.height() * this.attribute("fy").numValue() :
                    this.attribute("fy").Length.toPixels("y"));
                c = this.gradientUnits == "objectBoundingBox" ? (c.width() + c.height()) / 2 * this.attribute("r").numValue() : this.attribute("r").Length.toPixels();
                return a.createRadialGradient(g, j, 0, e, f, c)
            }
        };
        a.Element.radialGradient.prototype = new a.Element.GradientBase;
        a.Element.stop = function (c) {
            this.base = a.Element.ElementBase;
            this.base(c);
            this.offset = this.attribute("offset").numValue();
            c = this.style("stop-color");
            this.style("stop-opacity").hasValue() && (c = c.Color.addOpacity(this.style("stop-opacity").value));
            this.color = c.value
        };
        a.Element.stop.prototype = new a.Element.ElementBase;
        a.Element.AnimateBase = function (c) {
            this.base = a.Element.ElementBase;
            this.base(c);
            a.Animations.push(this);
            this.duration = 0;
            this.begin = this.attribute("begin").Time.toMilliseconds();
            this.maxDuration = this.begin + this.attribute("dur").Time.toMilliseconds();
            this.getProperty = function () {
                var a = this.attribute("attributeType").value, b = this.attribute("attributeName").value;
                return a == "CSS" ? this.parent.style(b, !0) : this.parent.attribute(b, !0)
            };
            this.initialValue =
                null;
            this.removed = !1;
            this.calcValue = function () {
                return ""
            };
            this.update = function (a) {
                if (this.initialValue == null)this.initialValue = this.getProperty().value;
                if (this.duration > this.maxDuration)if (this.attribute("repeatCount").value == "indefinite")this.duration = 0; else return this.attribute("fill").valueOrDefault("remove") == "remove" && !this.removed ? (this.removed = !0, this.getProperty().value = this.initialValue, !0) : !1;
                this.duration += a;
                a = !1;
                if (this.begin < this.duration)a = this.calcValue(), this.attribute("type").hasValue() &&
                (a = this.attribute("type").value + "(" + a + ")"), this.getProperty().value = a, a = !0;
                return a
            };
            this.progress = function () {
                return (this.duration - this.begin) / (this.maxDuration - this.begin)
            }
        };
        a.Element.AnimateBase.prototype = new a.Element.ElementBase;
        a.Element.animate = function (c) {
            this.base = a.Element.AnimateBase;
            this.base(c);
            this.calcValue = function () {
                var a = this.attribute("from").numValue(), b = this.attribute("to").numValue();
                return a + (b - a) * this.progress()
            }
        };
        a.Element.animate.prototype = new a.Element.AnimateBase;
        a.Element.animateColor =
            function (c) {
                this.base = a.Element.AnimateBase;
                this.base(c);
                this.calcValue = function () {
                    var a = new RGBColor(this.attribute("from").value), b = new RGBColor(this.attribute("to").value);
                    if (a.ok && b.ok) {
                        var c = a.r + (b.r - a.r) * this.progress(), e = a.g + (b.g - a.g) * this.progress(), a = a.b + (b.b - a.b) * this.progress();
                        return "rgb(" + parseInt(c, 10) + "," + parseInt(e, 10) + "," + parseInt(a, 10) + ")"
                    }
                    return this.attribute("from").value
                }
            };
        a.Element.animateColor.prototype = new a.Element.AnimateBase;
        a.Element.animateTransform = function (c) {
            this.base =
                a.Element.animate;
            this.base(c)
        };
        a.Element.animateTransform.prototype = new a.Element.animate;
        a.Element.font = function (c) {
            this.base = a.Element.ElementBase;
            this.base(c);
            this.horizAdvX = this.attribute("horiz-adv-x").numValue();
            this.isArabic = this.isRTL = !1;
            this.missingGlyph = this.fontFace = null;
            this.glyphs = [];
            for (c = 0; c < this.children.length; c++) {
                var d = this.children[c];
                if (d.type == "font-face")this.fontFace = d, d.style("font-family").hasValue() && (a.Definitions[d.style("font-family").value] = this); else if (d.type == "missing-glyph")this.missingGlyph =
                    d; else if (d.type == "glyph")d.arabicForm != "" ? (this.isArabic = this.isRTL = !0, typeof this.glyphs[d.unicode] == "undefined" && (this.glyphs[d.unicode] = []), this.glyphs[d.unicode][d.arabicForm] = d) : this.glyphs[d.unicode] = d
            }
        };
        a.Element.font.prototype = new a.Element.ElementBase;
        a.Element.fontface = function (c) {
            this.base = a.Element.ElementBase;
            this.base(c);
            this.ascent = this.attribute("ascent").value;
            this.descent = this.attribute("descent").value;
            this.unitsPerEm = this.attribute("units-per-em").numValue()
        };
        a.Element.fontface.prototype =
            new a.Element.ElementBase;
        a.Element.missingglyph = function (c) {
            this.base = a.Element.path;
            this.base(c);
            this.horizAdvX = 0
        };
        a.Element.missingglyph.prototype = new a.Element.path;
        a.Element.glyph = function (c) {
            this.base = a.Element.path;
            this.base(c);
            this.horizAdvX = this.attribute("horiz-adv-x").numValue();
            this.unicode = this.attribute("unicode").value;
            this.arabicForm = this.attribute("arabic-form").value
        };
        a.Element.glyph.prototype = new a.Element.path;
        a.Element.text = function (c) {
            this.base = a.Element.RenderedElementBase;
            this.base(c);
            if (c != null) {
                this.children = [];
                for (var d = 0; d < c.childNodes.length; d++) {
                    var b = c.childNodes[d];
                    b.nodeType == 1 ? this.addChild(b, !0) : b.nodeType == 3 && this.addChild(new a.Element.tspan(b), !1)
                }
            }
            this.baseSetContext = this.setContext;
            this.setContext = function (b) {
                this.baseSetContext(b);
                if (this.style("dominant-baseline").hasValue())b.textBaseline = this.style("dominant-baseline").value;
                if (this.style("alignment-baseline").hasValue())b.textBaseline = this.style("alignment-baseline").value
            };
            this.renderChildren =
                function (b) {
                    for (var a = this.style("text-anchor").valueOrDefault("start"), c = this.attribute("x").Length.toPixels("x"), d = this.attribute("y").Length.toPixels("y"), j = 0; j < this.children.length; j++) {
                        var h = this.children[j];
                        h.attribute("x").hasValue() ? h.x = h.attribute("x").Length.toPixels("x") : (h.attribute("dx").hasValue() && (c += h.attribute("dx").Length.toPixels("x")), h.x = c);
                        c = h.measureText(b);
                        if (a != "start" && (j == 0 || h.attribute("x").hasValue())) {
                            for (var l = c, o = j + 1; o < this.children.length; o++) {
                                var n = this.children[o];
                                if (n.attribute("x").hasValue())break;
                                l += n.measureText(b)
                            }
                            h.x -= a == "end" ? l : l / 2
                        }
                        c = h.x + c;
                        h.attribute("y").hasValue() ? h.y = h.attribute("y").Length.toPixels("y") : (h.attribute("dy").hasValue() && (d += h.attribute("dy").Length.toPixels("y")), h.y = d);
                        d = h.y;
                        h.render(b)
                    }
                }
        };
        a.Element.text.prototype = new a.Element.RenderedElementBase;
        a.Element.TextElementBase = function (c) {
            this.base = a.Element.RenderedElementBase;
            this.base(c);
            this.getGlyph = function (a, b, c) {
                var e = b[c], f = null;
                if (a.isArabic) {
                    var g = "isolated";
                    if ((c == 0 || b[c -
                        1] == " ") && c < b.length - 2 && b[c + 1] != " ")g = "terminal";
                    c > 0 && b[c - 1] != " " && c < b.length - 2 && b[c + 1] != " " && (g = "medial");
                    if (c > 0 && b[c - 1] != " " && (c == b.length - 1 || b[c + 1] == " "))g = "initial";
                    typeof a.glyphs[e] != "undefined" && (f = a.glyphs[e][g], f == null && a.glyphs[e].type == "glyph" && (f = a.glyphs[e]))
                } else f = a.glyphs[e];
                if (f == null)f = a.missingGlyph;
                return f
            };
            this.renderChildren = function (c) {
                var b = this.parent.style("font-family").Definition.getDefinition();
                if (b != null) {
                    var k = this.parent.style("font-size").numValueOrDefault(a.Font.Parse(a.ctx.font).fontSize),
                        e = this.parent.style("font-style").valueOrDefault(a.Font.Parse(a.ctx.font).fontStyle), f = this.getText();
                    b.isRTL && (f = f.split("").reverse().join(""));
                    for (var g = a.ToNumberArray(this.parent.attribute("dx").value), j = 0; j < f.length; j++) {
                        var h = this.getGlyph(b, f, j), l = k / b.fontFace.unitsPerEm;
                        c.translate(this.x, this.y);
                        c.scale(l, -l);
                        var o = c.lineWidth;
                        c.lineWidth = c.lineWidth * b.fontFace.unitsPerEm / k;
                        e == "italic" && c.transform(1, 0, 0.4, 1, 0, 0);
                        h.render(c);
                        e == "italic" && c.transform(1, 0, -0.4, 1, 0, 0);
                        c.lineWidth = o;
                        c.scale(1 /
                            l, -1 / l);
                        c.translate(-this.x, -this.y);
                        this.x += k * (h.horizAdvX || b.horizAdvX) / b.fontFace.unitsPerEm;
                        typeof g[j] != "undefined" && !isNaN(g[j]) && (this.x += g[j])
                    }
                } else c.strokeStyle != "" && c.strokeText(a.compressSpaces(this.getText()), this.x, this.y), c.fillStyle != "" && c.fillText(a.compressSpaces(this.getText()), this.x, this.y)
            };
            this.getText = function () {
            };
            this.measureText = function (c) {
                var b = this.parent.style("font-family").Definition.getDefinition();
                if (b != null) {
                    var c = this.parent.style("font-size").numValueOrDefault(a.Font.Parse(a.ctx.font).fontSize),
                        k = 0, e = this.getText();
                    b.isRTL && (e = e.split("").reverse().join(""));
                    for (var f = a.ToNumberArray(this.parent.attribute("dx").value), g = 0; g < e.length; g++) {
                        var j = this.getGlyph(b, e, g);
                        k += (j.horizAdvX || b.horizAdvX) * c / b.fontFace.unitsPerEm;
                        typeof f[g] != "undefined" && !isNaN(f[g]) && (k += f[g])
                    }
                    return k
                }
                b = a.compressSpaces(this.getText());
                if (!c.measureText)return b.length * 10;
                c.save();
                this.setContext(c);
                b = c.measureText(b).width;
                c.restore();
                return b
            }
        };
        a.Element.TextElementBase.prototype = new a.Element.RenderedElementBase;
        a.Element.tspan = function (c) {
            this.base = a.Element.TextElementBase;
            this.base(c);
            this.text = c.nodeType == 3 ? c.nodeValue : c.childNodes.length > 0 ? c.childNodes[0].nodeValue : c.text;
            this.getText = function () {
                return this.text
            }
        };
        a.Element.tspan.prototype = new a.Element.TextElementBase;
        a.Element.tref = function (c) {
            this.base = a.Element.TextElementBase;
            this.base(c);
            this.getText = function () {
                var a = this.attribute("xlink:href").Definition.getDefinition();
                if (a != null)return a.children[0].getText()
            }
        };
        a.Element.tref.prototype = new a.Element.TextElementBase;
        a.Element.a = function (c) {
            this.base = a.Element.TextElementBase;
            this.base(c);
            this.hasText = !0;
            for (var d = 0; d < c.childNodes.length; d++)if (c.childNodes[d].nodeType != 3)this.hasText = !1;
            this.text = this.hasText ? c.childNodes[0].nodeValue : "";
            this.getText = function () {
                return this.text
            };
            this.baseRenderChildren = this.renderChildren;
            this.renderChildren = function (b) {
                if (this.hasText) {
                    this.baseRenderChildren(b);
                    var c = new a.Property("fontSize", a.Font.Parse(a.ctx.font).fontSize);
                    a.Mouse.checkBoundingBox(this, new a.BoundingBox(this.x,
                        this.y - c.Length.toPixels("y"), this.x + this.measureText(b), this.y))
                } else c = new a.Element.g, c.children = this.children, c.parent = this, c.render(b)
            };
            this.onclick = function () {
                window.open(this.attribute("xlink:href").value)
            };
            this.onmousemove = function () {
                a.ctx.canvas.style.cursor = "pointer"
            }
        };
        a.Element.a.prototype = new a.Element.TextElementBase;
        a.Element.image = function (c) {
            this.base = a.Element.RenderedElementBase;
            this.base(c);
            a.Images.push(this);
            this.img = document.createElement("img");
            this.loaded = !1;
            var d = this;
            this.img.onload =
                function () {
                    d.loaded = !0
                };
            this.img.src = this.attribute("xlink:href").value;
            this.renderChildren = function (b) {
                var c = this.attribute("x").Length.toPixels("x"), d = this.attribute("y").Length.toPixels("y"), f = this.attribute("width").Length.toPixels("x"), g = this.attribute("height").Length.toPixels("y");
                f == 0 || g == 0 || (b.save(), b.translate(c, d), a.AspectRatio(b, this.attribute("preserveAspectRatio").value, f, this.img.width, g, this.img.height, 0, 0), b.drawImage(this.img, 0, 0), b.restore())
            }
        };
        a.Element.image.prototype = new a.Element.RenderedElementBase;
        a.Element.g = function (c) {
            this.base = a.Element.RenderedElementBase;
            this.base(c);
            this.getBoundingBox = function () {
                for (var c = new a.BoundingBox, b = 0; b < this.children.length; b++)c.addBoundingBox(this.children[b].getBoundingBox());
                return c
            }
        };
        a.Element.g.prototype = new a.Element.RenderedElementBase;
        a.Element.symbol = function (c) {
            this.base = a.Element.RenderedElementBase;
            this.base(c);
            this.baseSetContext = this.setContext;
            this.setContext = function (c) {
                this.baseSetContext(c);
                if (this.attribute("viewBox").hasValue()) {
                    var b =
                        a.ToNumberArray(this.attribute("viewBox").value), k = b[0], e = b[1];
                    width = b[2];
                    height = b[3];
                    a.AspectRatio(c, this.attribute("preserveAspectRatio").value, this.attribute("width").Length.toPixels("x"), width, this.attribute("height").Length.toPixels("y"), height, k, e);
                    a.ViewPort.SetCurrent(b[2], b[3])
                }
            }
        };
        a.Element.symbol.prototype = new a.Element.RenderedElementBase;
        a.Element.style = function (c) {
            this.base = a.Element.ElementBase;
            this.base(c);
            for (var c = c.childNodes[0].nodeValue + (c.childNodes.length > 1 ? c.childNodes[1].nodeValue :
                    ""), c = c.replace(/(\/\*([^*]|[\r\n]|(\*+([^*\/]|[\r\n])))*\*+\/)|(^[\s]*\/\/.*)/gm, ""), c = a.compressSpaces(c), c = c.split("}"), d = 0; d < c.length; d++)if (a.trim(c[d]) != "")for (var b = c[d].split("{"), k = b[0].split(","), b = b[1].split(";"), e = 0; e < k.length; e++) {
                var f = a.trim(k[e]);
                if (f != "") {
                    for (var g = {}, j = 0; j < b.length; j++) {
                        var h = b[j].indexOf(":"), l = b[j].substr(0, h), h = b[j].substr(h + 1, b[j].length - h);
                        l != null && h != null && (g[a.trim(l)] = new a.Property(a.trim(l), a.trim(h)))
                    }
                    a.Styles[f] = g;
                    if (f == "@font-face") {
                        f = g["font-family"].value.replace(/"/g,
                            "");
                        g = g.src.value.split(",");
                        for (j = 0; j < g.length; j++)if (g[j].indexOf('format("svg")') > 0) {
                            l = g[j].indexOf("url");
                            h = g[j].indexOf(")", l);
                            l = g[j].substr(l + 5, h - l - 6);
                            l = a.parseXml(a.ajax(l)).getElementsByTagName("font");
                            for (h = 0; h < l.length; h++) {
                                var o = a.CreateElement(l[h]);
                                a.Definitions[f] = o
                            }
                        }
                    }
                }
            }
        };
        a.Element.style.prototype = new a.Element.ElementBase;
        a.Element.use = function (c) {
            this.base = a.Element.RenderedElementBase;
            this.base(c);
            this.baseSetContext = this.setContext;
            this.setContext = function (a) {
                this.baseSetContext(a);
                this.attribute("x").hasValue() && a.translate(this.attribute("x").Length.toPixels("x"), 0);
                this.attribute("y").hasValue() && a.translate(0, this.attribute("y").Length.toPixels("y"))
            };
            this.getDefinition = function () {
                var a = this.attribute("xlink:href").Definition.getDefinition();
                if (this.attribute("width").hasValue())a.attribute("width", !0).value = this.attribute("width").value;
                if (this.attribute("height").hasValue())a.attribute("height", !0).value = this.attribute("height").value;
                return a
            };
            this.path = function (a) {
                var b =
                    this.getDefinition();
                b != null && b.path(a)
            };
            this.renderChildren = function (a) {
                var b = this.getDefinition();
                b != null && b.render(a)
            }
        };
        a.Element.use.prototype = new a.Element.RenderedElementBase;
        a.Element.mask = function (c) {
            this.base = a.Element.ElementBase;
            this.base(c);
            this.apply = function (a, b) {
                var c = this.attribute("x").Length.toPixels("x"), e = this.attribute("y").Length.toPixels("y"), f = this.attribute("width").Length.toPixels("x"), g = this.attribute("height").Length.toPixels("y"), j = b.attribute("mask").value;
                b.attribute("mask").value =
                    "";
                var h = document.createElement("canvas");
                h.width = c + f;
                h.height = e + g;
                var l = h.getContext("2d");
                this.renderChildren(l);
                var o = document.createElement("canvas");
                o.width = c + f;
                o.height = e + g;
                var n = o.getContext("2d");
                b.render(n);
                n.globalCompositeOperation = "destination-in";
                n.fillStyle = l.createPattern(h, "no-repeat");
                n.fillRect(0, 0, c + f, e + g);
                a.fillStyle = n.createPattern(o, "no-repeat");
                a.fillRect(0, 0, c + f, e + g);
                b.attribute("mask").value = j
            };
            this.render = function () {
            }
        };
        a.Element.mask.prototype = new a.Element.ElementBase;
        a.Element.clipPath =
            function (c) {
                this.base = a.Element.ElementBase;
                this.base(c);
                this.apply = function (a) {
                    for (var b = 0; b < this.children.length; b++)this.children[b].path && (this.children[b].path(a), a.clip())
                };
                this.render = function () {
                }
            };
        a.Element.clipPath.prototype = new a.Element.ElementBase;
        a.Element.filter = function (c) {
            this.base = a.Element.ElementBase;
            this.base(c);
            this.apply = function (a, b) {
                var c = b.getBoundingBox(), e = this.attribute("x").Length.toPixels("x"), f = this.attribute("y").Length.toPixels("y");
                if (e == 0 || f == 0)e = c.x1, f = c.y1;
                var g =
                    this.attribute("width").Length.toPixels("x"), j = this.attribute("height").Length.toPixels("y");
                if (g == 0 || j == 0)g = c.width(), j = c.height();
                c = b.style("filter").value;
                b.style("filter").value = "";
                var h = 0.2 * g, l = 0.2 * j, o = document.createElement("canvas");
                o.width = g + 2 * h;
                o.height = j + 2 * l;
                var n = o.getContext("2d");
                n.translate(-e + h, -f + l);
                b.render(n);
                for (var q = 0; q < this.children.length; q++)this.children[q].apply(n, 0, 0, g + 2 * h, j + 2 * l);
                a.drawImage(o, 0, 0, g + 2 * h, j + 2 * l, e - h, f - l, g + 2 * h, j + 2 * l);
                b.style("filter", !0).value = c
            };
            this.render =
                function () {
                }
        };
        a.Element.filter.prototype = new a.Element.ElementBase;
        a.Element.feGaussianBlur = function (c) {
            function d(a, c, d, f, g) {
                for (var j = 0; j < g; j++)for (var h = 0; h < f; h++)for (var l = a[j * f * 4 + h * 4 + 3] / 255, o = 0; o < 4; o++) {
                    for (var n = d[0] * (l == 0 ? 255 : a[j * f * 4 + h * 4 + o]) * (l == 0 || o == 3 ? 1 : l), q = 1; q < d.length; q++) {
                        var p = Math.max(h - q, 0), m = a[j * f * 4 + p * 4 + 3] / 255, p = Math.min(h + q, f - 1), p = a[j * f * 4 + p * 4 + 3] / 255, s = d[q], r;
                        m == 0 ? r = 255 : (r = Math.max(h - q, 0), r = a[j * f * 4 + r * 4 + o]);
                        m = r * (m == 0 || o == 3 ? 1 : m);
                        p == 0 ? r = 255 : (r = Math.min(h + q, f - 1), r = a[j * f * 4 + r * 4 + o]);
                        n +=
                            s * (m + r * (p == 0 || o == 3 ? 1 : p))
                    }
                    c[h * g * 4 + j * 4 + o] = n
                }
            }

            this.base = a.Element.ElementBase;
            this.base(c);
            this.apply = function (a, c, e, f, g) {
                var e = this.attribute("stdDeviation").numValue(), c = a.getImageData(0, 0, f, g), e = Math.max(e, 0.01), j = Math.ceil(e * 4) + 1;
                mask = [];
                for (var h = 0; h < j; h++)mask[h] = Math.exp(-0.5 * (h / e) * (h / e));
                e = mask;
                j = 0;
                for (h = 1; h < e.length; h++)j += Math.abs(e[h]);
                j = 2 * j + Math.abs(e[0]);
                for (h = 0; h < e.length; h++)e[h] /= j;
                tmp = [];
                d(c.data, tmp, e, f, g);
                d(tmp, c.data, e, g, f);
                a.clearRect(0, 0, f, g);
                a.putImageData(c, 0, 0)
            }
        };
        a.Element.filter.prototype =
            new a.Element.feGaussianBlur;
        a.Element.title = function () {
        };
        a.Element.title.prototype = new a.Element.ElementBase;
        a.Element.desc = function () {
        };
        a.Element.desc.prototype = new a.Element.ElementBase;
        a.Element.MISSING = function (a) {
            console.log("ERROR: Element '" + a.nodeName + "' not yet implemented.")
        };
        a.Element.MISSING.prototype = new a.Element.ElementBase;
        a.CreateElement = function (c) {
            var d = c.nodeName.replace(/^[^:]+:/, ""), d = d.replace(/\-/g, ""), b = null, b = typeof a.Element[d] != "undefined" ? new a.Element[d](c) : new a.Element.MISSING(c);
            b.type = c.nodeName;
            return b
        };
        a.load = function (c, d) {
            a.loadXml(c, a.ajax(d))
        };
        a.loadXml = function (c, d) {
            a.loadXmlDoc(c, a.parseXml(d))
        };
        a.loadXmlDoc = function (c, d) {
            a.init(c);
            var b = function (a) {
                for (var b = c.canvas; b;)a.x -= b.offsetLeft, a.y -= b.offsetTop, b = b.offsetParent;
                window.scrollX && (a.x += window.scrollX);
                window.scrollY && (a.y += window.scrollY);
                return a
            };
            if (a.opts.ignoreMouse != !0)c.canvas.onclick = function (c) {
                c = b(new a.Point(c != null ? c.clientX : event.clientX, c != null ? c.clientY : event.clientY));
                a.Mouse.onclick(c.x, c.y)
            },
                c.canvas.onmousemove = function (c) {
                    c = b(new a.Point(c != null ? c.clientX : event.clientX, c != null ? c.clientY : event.clientY));
                    a.Mouse.onmousemove(c.x, c.y)
                };
            var k = a.CreateElement(d.documentElement), e = k.root = !0, f = function () {
                a.ViewPort.Clear();
                c.canvas.parentNode && a.ViewPort.SetCurrent(c.canvas.parentNode.clientWidth, c.canvas.parentNode.clientHeight);
                if (a.opts.ignoreDimensions != !0) {
                    if (k.style("width").hasValue())c.canvas.width = k.style("width").Length.toPixels("x"), c.canvas.style.width = c.canvas.width + "px";
                    if (k.style("height").hasValue())c.canvas.height =
                        k.style("height").Length.toPixels("y"), c.canvas.style.height = c.canvas.height + "px"
                }
                var b = c.canvas.clientWidth || c.canvas.width, d = c.canvas.clientHeight || c.canvas.height;
                a.ViewPort.SetCurrent(b, d);
                if (a.opts != null && a.opts.offsetX != null)k.attribute("x", !0).value = a.opts.offsetX;
                if (a.opts != null && a.opts.offsetY != null)k.attribute("y", !0).value = a.opts.offsetY;
                if (a.opts != null && a.opts.scaleWidth != null && a.opts.scaleHeight != null) {
                    var f = 1, g = 1;
                    k.attribute("width").hasValue() && (f = k.attribute("width").Length.toPixels("x") /
                        a.opts.scaleWidth);
                    k.attribute("height").hasValue() && (g = k.attribute("height").Length.toPixels("y") / a.opts.scaleHeight);
                    k.attribute("width", !0).value = a.opts.scaleWidth;
                    k.attribute("height", !0).value = a.opts.scaleHeight;
                    k.attribute("viewBox", !0).value = "0 0 " + b * f + " " + d * g;
                    k.attribute("preserveAspectRatio", !0).value = "none"
                }
                a.opts.ignoreClear != !0 && c.clearRect(0, 0, b, d);
                k.render(c);
                e && (e = !1, a.opts != null && typeof a.opts.renderCallback == "function" && a.opts.renderCallback())
            }, g = !0;
            a.ImagesLoaded() && (g = !1, f());
            a.intervalID = setInterval(function () {
                var b = !1;
                g && a.ImagesLoaded() && (g = !1, b = !0);
                a.opts.ignoreMouse != !0 && (b |= a.Mouse.hasEvents());
                if (a.opts.ignoreAnimation != !0)for (var c = 0; c < a.Animations.length; c++)b |= a.Animations[c].update(1E3 / a.FRAMERATE);
                a.opts != null && typeof a.opts.forceRedraw == "function" && a.opts.forceRedraw() == !0 && (b = !0);
                b && (f(), a.Mouse.runEvents())
            }, 1E3 / a.FRAMERATE)
        };
        a.stop = function () {
            a.intervalID && clearInterval(a.intervalID)
        };
        a.Mouse = new function () {
            this.events = [];
            this.hasEvents = function () {
                return this.events.length !=
                    0
            };
            this.onclick = function (a, d) {
                this.events.push({
                    type: "onclick", x: a, y: d, run: function (a) {
                        if (a.onclick)a.onclick()
                    }
                })
            };
            this.onmousemove = function (a, d) {
                this.events.push({
                    type: "onmousemove", x: a, y: d, run: function (a) {
                        if (a.onmousemove)a.onmousemove()
                    }
                })
            };
            this.eventElements = [];
            this.checkPath = function (a, d) {
                for (var b = 0; b < this.events.length; b++) {
                    var k = this.events[b];
                    d.isPointInPath && d.isPointInPath(k.x, k.y) && (this.eventElements[b] = a)
                }
            };
            this.checkBoundingBox = function (a, d) {
                for (var b = 0; b < this.events.length; b++) {
                    var k =
                        this.events[b];
                    d.isPointInBox(k.x, k.y) && (this.eventElements[b] = a)
                }
            };
            this.runEvents = function () {
                a.ctx.canvas.style.cursor = "";
                for (var c = 0; c < this.events.length; c++)for (var d = this.events[c], b = this.eventElements[c]; b;)d.run(b), b = b.parent;
                this.events = [];
                this.eventElements = []
            }
        };
        return a
    }

    this.canvg = function (a, c, d) {
        if (a == null && c == null && d == null)for (var c = document.getElementsByTagName("svg"), b = 0; b < c.length; b++) {
            a = c[b];
            d = document.createElement("canvas");
            d.width = a.clientWidth;
            d.height = a.clientHeight;
            a.parentNode.insertBefore(d,
                a);
            a.parentNode.removeChild(a);
            var k = document.createElement("div");
            k.appendChild(a);
            canvg(d, k.innerHTML)
        } else d = d || {}, typeof a == "string" && (a = document.getElementById(a)), a.svg == null ? (b = m(), a.svg = b) : (b = a.svg, b.stop()), b.opts = d, a = a.getContext("2d"), typeof c.documentElement != "undefined" ? b.loadXmlDoc(a, c) : c.substr(0, 1) == "<" ? b.loadXml(a, c) : b.load(a, c)
    }
})();
if (CanvasRenderingContext2D)CanvasRenderingContext2D.prototype.drawSvg = function (m, a, c, d, b) {
    canvg(this.canvas, m, {
        ignoreMouse: !0,
        ignoreAnimation: !0,
        ignoreDimensions: !0,
        ignoreClear: !0,
        offsetX: a,
        offsetY: c,
        scaleWidth: d,
        scaleHeight: b
    })
};
(function (m) {
    var a = m.css, c = m.CanVGRenderer, d = m.SVGRenderer, b = m.extend, k = m.merge, e = m.addEvent, f = m.createElement, g = m.discardElement;
    b(c.prototype, d.prototype);
    b(c.prototype, {
        create: function (a, b, c, d) {
            this.setContainer(b, c, d);
            this.configure(a)
        }, setContainer: function (a, b, c) {
            var d = a.style, e = a.parentNode, g = d.left, d = d.top, k = a.offsetWidth, m = a.offsetHeight, s = {
                visibility: "hidden",
                position: "absolute"
            };
            this.init.apply(this, [a, b, c]);
            this.canvas = f("canvas", {width: k, height: m}, {position: "relative", left: g, top: d}, a);
            this.ttLine = f("div", null, s, e);
            this.ttDiv = f("div", null, s, e);
            this.ttTimer = void 0;
            this.hiddenSvg = a = f("div", {width: k, height: m}, {visibility: "hidden", left: g, top: d}, e);
            a.appendChild(this.box)
        }, configure: function (b) {
            var c = this, d = b.options.tooltip, f = d.borderWidth, g = c.ttDiv, m = d.style, p = c.ttLine, t = parseInt(m.padding, 10), m = k(m, {
                padding: t + "px",
                "background-color": d.backgroundColor,
                "border-style": "solid",
                "border-width": f + "px",
                "border-radius": d.borderRadius + "px"
            });
            d.shadow && (m = k(m, {
                "box-shadow": "1px 1px 3px gray",
                "-webkit-box-shadow": "1px 1px 3px gray"
            }));
            a(g, m);
            a(p, {"border-left": "1px solid darkgray"});
            e(b, "tooltipRefresh", function (d) {
                var e = b.container, f = e.offsetLeft, e = e.offsetTop, k;
                g.innerHTML = d.text;
                k = b.tooltip.getPosition(g.offsetWidth, g.offsetHeight, {plotX: d.x, plotY: d.y});
                a(g, {visibility: "visible", left: k.x + "px", top: k.y + "px", "border-color": d.borderColor});
                a(p, {
                    visibility: "visible",
                    left: f + d.x + "px",
                    top: e + b.plotTop + "px",
                    height: b.plotHeight + "px"
                });
                c.ttTimer !== void 0 && clearTimeout(c.ttTimer);
                c.ttTimer = setTimeout(function () {
                    a(g,
                        {visibility: "hidden"});
                    a(p, {visibility: "hidden"})
                }, 3E3)
            })
        }, destroy: function () {
            g(this.canvas);
            this.ttTimer !== void 0 && clearTimeout(this.ttTimer);
            g(this.ttLine);
            g(this.ttDiv);
            g(this.hiddenSvg);
            return d.prototype.destroy.apply(this)
        }, color: function (a, b, c) {
            a && a.linearGradient && (a = a.stops[a.stops.length - 1][1]);
            return d.prototype.color.call(this, a, b, c)
        }, draw: function () {
            window.canvg(this.canvas, this.hiddenSvg.innerHTML)
        }
    })
})(Highcharts);
